package modulo9;

/**
 * Classe que armazena todas as informações sobre uma 
 * disciplina cursada de um aluno.
 * 
 * @author Nícolas Riccieri Gardin Assumpção    Ra: 121245
 * @author Lucas Borges Moreira de Souza        Ra: 034126
 * @author Ivan Henrique Costa Petrin           Ra: 117300
 * @author Joseph Victoria Lorenzo V            Ra: 119651
 * @author Érick Machado Seolin                 Ra: 120891
 * @author Leonardo Gabriel Sousa Sorensen      Ra: 121096
 */
public class DisciplinaCursada {
    
    /**
     * Nome dos diversos tipos de aprovação em disciplinas
     */
    public final String[] TIPO_APROVACAO= {"SEM INFORMACAO",
                                            "DISPENSADO DE CURSAR DISCIPLINA",
                                            "PROFICIENCIA",
                                            "APROVADO POR FREQUENCIA",
                                            "APROVADO POR NOTA E FREQUENCIA",
                                            "REPROVADO POR NOTA",
                                            "REPROVADO POR FREQUENCIA",
                                            "APROVEITAMENTO DE ESTUDOS",
                                            "DESISTENCIA",
                                            "DISCIPLINA CANCELADA OFICIO",
                                            "DISPENSA DISCIPLINA PEDAGOGICA",
                                            "DISPENSA POR IDADE",
                                            "DISPENSA POR PROLE",
                                            "DISPENSA POR TRABALHO",
                                            "DISPENSA POR DEFICIENCIA FISICA",
                                            "DISPENSA POR NAO OFERECIMENTO",
                                            "PRATICA ED. FISICA SERV. MILITAR",
                                            "SUFICIENTE - APROVADO",
                                            "INSUFICIENTE - REPROVADO"};
    
    private String linha;
    private String materia;
    private String turma;
    private int creditos;
    private char aproveitamento;
    private char categoria;
    private double nota;
    private int cargaHoraria;
    private int codigoAprovacao;
    private String periodo;

    /**
     * Retorna o aproveitamento da disciplina.
     * 
     * @return OBRIGATORIA, ELETIVA, EXTRA-CURRICULAR ou 
     * DESCONHECIDO caso não conheça o tipo
     */
    public String getAproveitamento() {
        if(this.aproveitamento == '+'){
            return "OBRIGATORIA";
        }
        else if(aproveitamento=='*'){
            return "ELETIVA";
        }
        else if(aproveitamento=='X'){
            return "EXTRA-CURRICULAR";
        }
        return "DESCONHECIDO";
    }

    /**
     * Retorna a carga horaria da disciplina
     * @return carga horaria em horas
     */
    private int getCargaHoraria() {
        return cargaHoraria;
    }

    /**
     * Retorna a categoria da disciplina
     * @return ESPECIAL, ESPECIAL CONVIDADO, ESPECIAL EX-OFFICIO ou 
     * DESCONHECIDO caso o tipo não seja conhecido
     */
    public String getCategoria() {
        if(this.categoria == '!'){
            return "ESPECIAL";
        }
        else if(this.categoria=='&'){
            return "ESPECIAL CONVIDADO";
        }
        else if(this.categoria=='?'){
            return "ESPECIAL EX-OFFICIO";
        }
        return "DESCONHECIDO";
    }

    /**
     * Retorna o tipo de aprovação na matéria
     * @return uma das strings de TIPO_APROVACAO.
     */
    public String getCodigoAprovacao() {
        return this.TIPO_APROVACAO[codigoAprovacao];
    }


    /**
     * Retorna quantos créditos a disciplina apresenta
     * @return número de créditos
     */
    public int getCreditos() {
        return creditos;
    }

    /**
     * Retorna a linha retirada da integralização referente a esta disciplina
     * @return String da linha
     */
    private String getLinha() {
        return linha;
    }

    /**
     * Retorna a sigla da disciplina
     * @return sigla da disciplina
     */
    public String getMateria() {
        return materia;
    }

    /**
     * Retorna a nota final obtida na disciplina
     * @return nota final
     */
    public double getNota() {
        return nota;
    }

    /**
     * Retorna o período referente à disciplina
     * @return período
     */
    public String getPeriodo() {
        return periodo;
    }

    /**
     * Retorna a turma em que a disciplina foi realizada
     * @return Letra da turma
     */
    public String getTurma() {
        return turma;
    }

    /**
     * Contrutor para a classe DisciplinaCursada
     * @param l linha
     * @param m sigla da disciplina
     * @param t turma
     * @param c creditos
     * @param a aproveitamento
     * @param cat categoria
     * @param n nota
     * @param ch carga horária
     * @param ca código da aprovação
     * @param p período
     */
    public DisciplinaCursada(String l, String m, String t, int c, char a,
                            char cat, double n, int ch, int ca, String p){
        this.linha = l;
        this.materia = m;
        this.turma = t;
        this.creditos = c;
        this.aproveitamento = a;
        this.categoria = cat;
        this.nota = n;
        this.cargaHoraria = ch;
        this.codigoAprovacao = ca;
        this.periodo = p;
    }
    
    /**
     * Devolve se disciplina pode ser usada como cumprimento de pré-requisito
     * @return true se disciplina pode ser usada como 
     * cumprimento de pré-requisito
     */ 
    public boolean IsCumprimento(){
        return (this.codigoAprovacao != 0 && this.codigoAprovacao != 5 && 
                this.codigoAprovacao != 6 && this.codigoAprovacao != 8 && 
                this.codigoAprovacao != 9 && this.codigoAprovacao != 17 &&
                this.codigoAprovacao != 18 && this.codigoAprovacao != 19 &&
                this.codigoAprovacao != 21);
    }
    
    @Override
    public String toString(){
        return this.materia;
    }
}
